home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / falcon / nt_dsp1.lzh / NT_DSP1.MSA / SPECTRUM / ASPEC2.ASM next >
Encoding:
Assembly Source File  |  1992-08-07  |  24.3 KB  |  441 lines

  1.           title  'Log-Log Audio Spectrum Analyzer'
  2. ;**************************************************************************
  3. ;*     Motorola Austin DSP Operation  June 06, 1991                       *
  4. ;*                                                                        *
  5. ;*       *  ALTHOUGH THE INFORMATION CONTAINED HEREIN,    *               *
  6. ;*       *  AS WELL AS ANY INFORMATION PROVIDED RELATIVE  *               *
  7. ;*       *  THERETO, HAS BEEN CAREFULLY REVIEWED AND IS   *               *
  8. ;*       *  BELIEVED ACCURATE, MOTOROLA ASSUMES NO        *               *
  9. ;*       *  LIABILITY ARISING OUT OF ITS APPLICATION OR   *               *
  10. ;*       *  USE, NEITHER DOES IT CONVEY ANY LICENSE UNDER *               *
  11. ;*       *  ITS PATENT RIGHTS NOR THE RIGHTS OF OTHERS.   *               *
  12. ;*                                                                        *
  13. ;*  This program originally available on the Motorola DSP bulletin board. *
  14. ;*  It is provided under a DISCLAMER OF WARRANTY available from           *
  15. ;*  Motorola DSP Operation, 6501 Wm. Cannon Drive W., Austin, Tx., 78735. *
  16. ;*                                                                        *
  17.  
  18. ;**********************************************************************
  19. ; Real time log-log scale spectrum analyzer program                   *
  20. ;**********************************************************************
  21. ;   Source file name :        aspec2.asm
  22. ;         0.0     Jan.  3 1990
  23. ;         1.0     Mar. 23 1990 
  24. ;         1.1     Jul. 26 1990      - speed-up for windowing
  25. ;         1.2     Oct. 18 1990      - collapsed into single Goertzel sub. 
  26. ;         2.0     Feb. 28 1990      - added interrupt driven input
  27. ;
  28. ; -This program will take in N samples from the DSP56ADC16 sigma delta 
  29. ;  converter and perform a DFT routine using Goertzel method.
  30. ; -The receive input buffer is filled under interrupt control
  31. ; -When the computations for the spectrum are completed, the input
  32. ;  buffer (RXBUFF) is copied into D_IN and a new set of computations
  33. ;  begin. During this time, RXBUFF continues to get new data samples,but
  34. ;  this does not corrupt the buffer move because the oldeset sample is
  35. ;  copied before the next input sample overwrites it. All other samples
  36. ;  will have adequate time to be copied before changed by the input.
  37. ; -Results are sent to a PCM-56 DAC
  38. ; -The spectrum is viewed on a scope.
  39. ;
  40. ; Notes: 60, 0, -60, and -120 dB output reference levels
  41. ;    DSP56001 REV C is required for SSI mixed length frame syncs
  42. ;    Requires ADC16EVB modified for async SSI
  43. ;-----------------------------------------------------------------------------
  44.           page   255,66,3,3,5
  45.           opt    nomd,nomex,nocex
  46.  
  47. BOOTMODE  equ    ROM                        ;1 == boot from ROM
  48. start     equ    $40                        ;location of main routine
  49. ROMBASE   equ    $4000                      ;load address of ROM - $8000
  50. POINTS    equ    2048                       ;number of input data points($800)
  51. D_IN      equ    0                          ;location of input data table
  52. D_OUT     equ    POINTS                     ;location of output display table
  53. COS_TABL  equ    POINTS/2                   ;sine and cosine table 
  54. SIN_TABL  equ    POINTS/2+POINTS/4
  55. BUF1      equ    POINTS                     ;location for 1024 data buffer
  56. BUF2      equ    POINTS+POINTS/2            ;location for 512  data buffer
  57. BUF3      equ    POINTS+POINTS/2+POINTS/4   ;location for 256  data buffer
  58. WIN_TABL  equ    0                          ;location of Blackman_Harris window
  59. RXBUFF    equ    2*POINTS                   ;location of input data
  60.  
  61. ;----------------------------------------------------------------------------
  62. ;            ***** MEMORY MAP *****
  63. ;         -X-                       -Y-
  64. ;                                   $1800 --------
  65. ;                                   $1000 RXBUFFER   
  66. ;        $0F00 -----                  .
  67. ;        $0E00 BUF3                   .         
  68. ;        $0C00 BUF2                   .         
  69. ;                                   $0A00  Polynomial Coefficients
  70. ;        $0800 BUF1                 $0800  D_OUT
  71. ;                                   $0600  SINE   Table
  72. ;                                   $0400  COSINE Table
  73. ;        $0000 D_IN                 $0000  Window Table
  74. ;----------------------------------------------------------------------------
  75.  
  76. ;    MOTOROLA DSP56001 Internal I/O Addresses
  77.  
  78. m_ipr     equ    $ffff       ;Interrupt Prioroty Register
  79. m_bcr     equ    $fffe       ;Bus Control Register
  80. m_sccr    equ    $fff2       ;SCI Clock Control Register
  81. m_scr     equ    $fff0       ;SCI Control Register
  82. m_tx      equ    $ffef       ;SSI Tx Data Register
  83. m_rx      equ    $ffef       ;SSI Rx Data Register
  84. m_sr      equ    $ffee       ;SSI Status  Register
  85. m_crb     equ    $ffed       ;SSI Control Register A
  86. m_cra     equ    $ffec       ;SSI Control Register B
  87. m_bdr     equ    $ffe4       ;Port-B Data Register
  88. m_bddr    equ    $ffe2       ;Port-B Data Direction Register
  89. m_pcc     equ    $ffe1       ;Port-C Control register
  90.  
  91.  
  92.           IF     BOOTMODE==1                ;*** if booting from ROM ***
  93.           MSG    'Building Code for ROM Boot'
  94. ;--------------------------------------------------------------------------
  95. ;       RESET vector
  96. ;       first, move the tables from ROM into data memory
  97. ;--------------------------------------------------------------------------
  98.           org    p:0,p:ROMBASE         ;RUN @ P:$0000, LOAD from P:$C000
  99. GO        move   #$C000+(3*WIN_LOC),r0 ;points to start of tables in ROM
  100.           move   #0,r5                 ;destination for tables in Y:
  101.           do     #Tab_Len,_table       ;load all tables..., length <= $FFF
  102.           do     #3,_word              ;3 bytes per word...
  103.           move   P:(R0)+,A2            ;get a byte from P:ROM
  104.           rep    #8                    ;shift it into position...
  105.           asr    A                     ;...to form a 24-bit word
  106. _word                                  
  107.           move   A1,y:(r5)+            ;move complete word into y:memory
  108. _table
  109.           jmp    <SPEC
  110.  
  111.           ELSE
  112.           MSG    'Building Code for ADM execution'
  113.           org    p:$0C
  114.  
  115.           ENDIF
  116. ;-------------------------------------
  117. ;       SSI RX Interrupt vector
  118. ;-------------------------------------          
  119.                                        ; *** org    p:$000C,P: ***
  120.           movep  x:m_tx,y:(r1)+        ;input from ADC16
  121.           nop
  122.           movep  x:m_tx,y:(r1)+        ;input from ADC16
  123.           nop
  124. ;-------------------------------------
  125. ;       SSI TX Interrupt vector
  126. ;-------------------------------------          
  127.           movep  y:(r6)+,x:m_rx        ;output to D/A PCM-56
  128.           nop
  129.           movep  y:(r6)+,x:m_rx        ;output to D/A PCM-56
  130.           nop
  131.  
  132.           DUP    $2C                   ;fill unused vectors w/ nops
  133.           nop
  134.           ENDM
  135.  
  136. ;-------------------------------------
  137. ;  Initialization
  138. ;-------------------------------------
  139.                                        ;this code s/b @ P:$0040
  140. SPEC      movep  #0,x:m_bcr            ;set bcr to zero
  141.           movec  #0,sp                 ;init stack pointer
  142.           movec  #0,sr                 ;clear loop flag
  143.           movep  #0,x:m_pcc            ;zero PCC to cycle it, reset peripherals
  144. ;-----------------------------------------------------------------------
  145. ; set the SCI to provide ADC16 clock
  146. ;-----------------------------------------------------------------------
  147.           movep  #$1000,x:m_sccr       ;SCCR pattern for sclk= x16 baud rate
  148.           movep  #$2,x:m_scr           ;SCR pattern for sclk= x16 baud rate
  149. ;-----------------------------------------------------------------------
  150. ; set the SSI to recieve ADC16's output 
  151. ; and to transmit to the PCM56 using asynchronous, normal mode. 
  152. ;-----------------------------------------------------------------------
  153.           movep  #$4107,x:m_cra        ;CRA pattern for word length=16 bits                                       ;xmit bit rate
  154.           movep  #$B1B0,x:m_crb        ;CRB pattern for cont.clk,async,normal mode 
  155.           movep  #$0001FF,x:m_pcc      ;write PCC, enable peripherals
  156. ;--------------------------------------------------------------------------
  157. ;       Input sample rate is controlled by DSP56001 SCI via DSPADC16.   
  158. ;       Display rate is generated by DSP56001 (Fosc/512)
  159. ;--------------------------------------------------------------------------
  160.           move   #D_OUT,r4             ;R4 for write into display buffer
  161.           move   r4,r6                 ;R6 for read  from display buffer
  162.           move   #RXBUFF,r1            ;R1 for write into RCV     buffer
  163.           move   #POINTS/4-1,m4        ;both R4 & R6 use modulus addressing
  164.           move   m4,m6                 ;MOD = buffer length = POINTS/2
  165.           move   #POINTS-1,m1          ;...RCV BUFFER is also MOD addr.
  166.           movep  #$3000,x:m_ipr        ;set SSI interrupt priority
  167.           andi   #$fc,MR               ;unmask  interrupts
  168.                                        ;...after reset, Mx=$FFFF
  169.  
  170.  
  171.           page
  172. ;---------------------------------------------------------------------------
  173. ;                    ********************************
  174. ;                    *     MAIN PROGRAM ROUTINE     *
  175. ;                    ********************************
  176. ;
  177. ; The following registers have DEDICATED usage and should not be altered:
  178. ;         R1 - input buffer   write pointer   M1 - POINTS   - 1
  179. ;         R4 - display buffer write pointer   M4 - POINTS/4 - 1
  180. ;         R6 - display buffer read  pointer   M6 - same as M4
  181. ;---------------------------------------------------------------------------
  182. ;    get the oldest data in the input area and move it into the 
  183. ;        input buffer, shifting right 8-bits ( / 256 ) on the fly
  184. ;---------------------------------------------------------------------------
  185.  
  186. top       move   #D_IN,r0              ;pointer to input data buffer
  187.           move   #>$008000,x0          ;scale input data by 1/256 (>> 8)
  188.           move   #$0001,n1
  189.           move   m1,m5                 ;input will use mod. addressing here
  190.           lua    (r1)+n,r5             ;adjust pointer, 
  191.           move   y:(r1),y1             ;get A/D converter oldest data
  192.           mpy    y1,x0,a               ;and compute 1st output
  193.           do     #POINTS,_readin       ;read in 2048 points, interruptable
  194.           mpy    y1,x0,a    y:(r5)+,y1     a,x:(r0)+  ;shift, read, write  
  195. _readin                                               ;...I like it!..
  196.           move   #-1,m5              ;restore linear addressing
  197.  
  198. ;---------------------------------------------------------------------------
  199. ; copy first 1024 points to BUF1 with a window function
  200. ;         NOTE:  data has been scaled by 1/256 during input
  201. ;---------------------------------------------------------------------------
  202.           move   #WIN_TABL,r2          ;pointer to window in Y space
  203.           move   #2,n2                 ;off-set register for every 2nd window
  204.           move   #D_IN,r0              ;pointer to data in X space
  205.           move   #D_IN+(POINTS/2)-1,r3 ;points to last input data point
  206.           move   #BUF1,r5              ;point to 1024-point buffer
  207.           move   #BUF1+(POINTS/2)-1,r7 ;points to end of output data buffer
  208.           move   x:(r0)+,x0                 ;get 1st data point
  209.           move   y:(r2)+n2,y0               ;get 1st window value
  210.  
  211.           do     #POINTS/4,wind1            ;do 512 pairs of points
  212.           mpy    x0,y0,a     x:(r3)-,x0     ;apply window and get the sample
  213.           mpy    x0,y0,a   a,x:(r5)+        ;apply window to last sample, store early sample
  214.           move               x:(r0)+,x0     ;get next early sample..
  215.           move   a,x:(r7)-   y:(r2)+n2,y0   ;store sample at end of buffer
  216. wind1                                       ;get next window value
  217. ;---------------------------------------------------------------------------
  218. ;   copy 512 points to BUF2 with a window function
  219. ;         NOTE: samples are scaled up by a factor of 2 before storage
  220. ;               automatic scaling provides the shift
  221. ;---------------------------------------------------------------------------
  222.           move   #WIN_TABL,r2               ;pointer to window in Y space
  223.           move   #4,n2                      ;off-set for every 4-th window point
  224.           move   #D_IN,r0                   ;pointer to data in X space
  225.           move   #D_IN+(POINTS/4)-1,r3      ;points to last input data point
  226.           move   #BUF2,r5                   ;point to 512 size buffer
  227.           move   #BUF2+(POINTS/4)-1,r7      ;points to end of output data buffer
  228.           move   x:(r0)+,x0                 ;get first sample
  229.           move   y:(r2)+n2,y0               ;get first window value
  230.  
  231.           bset   #9,SR                      ;Scaling mode 2; ASL--> XDB,YDB
  232.           do     #POINTS/8,wind2            ;do first 256 pairs of points
  233.           mpy    x0,y0,a     x:(r3)-,x0     ;apply window, get end sample
  234.           mpy    x0,y0,a   a,x:(r5)+        ;window end sample, store early sample
  235.           move               x:(r0)+,x0     ;scale end sample, get next early sample
  236.           move   a,x:(r7)-   y:(r2)+n2,y0   ;store end sample, get next window value
  237. wind2
  238. ;---------------------------------------------------------------------------
  239. ;       copy 256 points to BUF3 with a window function
  240. ;         NOTE: data samples are scaled up by 2 bits before storage
  241. ;               scaling mode provides one bit of shift automatically...
  242. ;---------------------------------------------------------------------------
  243.           move   #WIN_TABL,r2               ;pointer to window in Y space
  244.           move   #8,n2                      ;off-set for every 4-th window point
  245.           move   #D_IN,r0                   ;pointer to data in X space
  246.           move   #D_IN+(POINTS/8)-1,r3      ;points to last input data point
  247.           move   #BUF3,r5                   ;point to 512 size buffer
  248.           move   #BUF3+(POINTS/8)-1,r7      ;points to end of output data buffer
  249.           move   x:(r0)+,x0  
  250.           move   y:(r2)+n2,y0               ;get proper window value
  251.  
  252.           do     #POINTS/16,wind3           ;do 128 pairs of points
  253.           mpyr   x0,y0,a     x:(r3)-,x0     ;windowing
  254.           asl    a
  255.           mpyr   x0,y0,a   a,x:(r5)+        ;windowing
  256.           asl    a           x:(r0)+,x0
  257.           move   a,x:(r7)-   y:(r2)+n2,y0   ;store into input buffer
  258. wind3
  259. ;---------------------------------------------------------------------------
  260. ;       Apply window to 2048 input data samples -- in place
  261. ;         NOTE: data is scaled down by one bit before storage
  262. ;---------------------------------------------------------------------------
  263.           move   #WIN_TABL,r7               ;pointer to window     in Y space
  264.           move   #D_IN,r0                   ;pointer to data start in X space
  265.           move   #D_IN+POINTS-1,r2          ;pointer to data end   in X space
  266.  
  267.           bclr   #9,SR                      ;turn scaling OFF
  268.           bset   #8,SR                      ;scale by ASR 1 bit
  269.           do     #POINTS/2,wind4            ;do first 1024 pairs of points
  270.           move   x:(r0),x0     y:(r7)+,y0   ;get start data and window value
  271.           mpy    x0,y0,a       x:(r2),x0    ;...windowing...get end points
  272.           mpy    x0,y0,a     a,x:(r0)+      ;store into input buffer
  273.           move               a,x:(r2)-
  274. wind4
  275.           bclr  #8,SR                       ;turn scaling OFF
  276. ;---------------------------------------------------------------------
  277. ;       Place calibrated levels at start of the display table 
  278. ;       Levels 60, 0, -60, and -120.0 dB (15 dB/div on 8 div scope)
  279. ;---------------------------------------------------------------------
  280.           move   #0.31143,a                 ;  60 dB level for trigger syncing
  281.           clr    b         a,y:(r4)+        ;   0 dB level --> B
  282.           neg    a         b,y:(r4)+        ; -60 dB level --> A
  283.           asl    a         a,y:(r4)+        ;-120 dB level --> A
  284.           move             a,y:(r4)+                  
  285.  
  286.           stitle             'main data processing loop'
  287.           page       
  288. ;----------------------------------------------------------------------------
  289. ;  Data Processing Routine (N point DFT using the Goertzel algorithm)
  290. ;----------------------------------------------------------------------------
  291.           move   #SIN_TABL+4,r5             ;R5 points to sin Ymem table 
  292.           move   #COS_TABL+4,r3             ;R3 points to cos Xmem table 
  293. ;----------------------------------------------------------------------------
  294. ;  Run first 256-4 point DFT using the Goertzel algorithm
  295. ;----------------------------------------------------------------------------
  296.           move   #D_IN,n2                   ;n2 points to input data Xmem table 
  297.           move   #POINTS/8-4,n3             ;run first 256-4 points DFT
  298.           move   #POINTS-1,n5               ;do 2048 point DFT
  299.           jsr    Goertzel
  300.  
  301. ;----------------------------------------------------------------------------
  302. ;  next 128 point DFT using the Goertzel algorithm
  303. ;----------------------------------------------------------------------------
  304.           move   #BUF1,n2                   ;n2 points to input data Xmem table 
  305.           move   #POINTS/16,n3              ;run next 128 point DFT
  306.           move   #POINTS/2-1,n5             ;do 1024 points DFT
  307.           jsr    Goertzel
  308.  
  309. ;----------------------------------------------------------------------------
  310. ;  next  64 point DFT using the Goertzel algorithm
  311. ;----------------------------------------------------------------------------
  312.           move   #BUF2,n2                   ;n2 points to input data Xmem table 
  313.           move   #POINTS/32,n3              ;run next 64 point DFT
  314.           move   #POINTS/4-1,n5             ;do 512 points DFT
  315.           jsr    Goertzel
  316.  
  317. ;----------------------------------------------------------------------------
  318. ;  last 64 point DFT using the Goertzel algorithm
  319. ;----------------------------------------------------------------------------
  320.           move   #BUF3,n2                   ;n2 points to input data Xmem table 
  321.           move   #POINTS/32,n3              ;run next 64 point DFT
  322.           move   #POINTS/8-1,n5             ;do 256 points DFT
  323.           jsr    Goertzel
  324.  
  325.           bset   #14,x:m_crb                ;enable SSI (TRE) interrupt
  326.           jmp    top                        ;do main program over again 
  327.  
  328.           stitle             'Goertzel DFT Routine'
  329.           page
  330. ;-------------------------------------------------------------------------
  331. ;    Goertzel Algorithm for computing DFT
  332. ;  solve for yr + yi = (x(n)+yr'*cosx-yi'*sinx) + i(yr'*sinx+yi'*cosx)
  333. ;
  334. ;         on entry:  n2 points to the input data buffer in Xmem
  335. ;                    n3 contains the number of output points
  336. ;                    n5 contains the number of input  points
  337. ;                    r3 points to cosine table
  338. ;                    r5 points to sine   table
  339. ;                    
  340. ;-------------------------------------------------------------------------
  341. Goertzel
  342.           do     n3,Goer_out                ;run DFT
  343.           move   n2,r2
  344.           clr    b         y:(r3)+,x1       ;x1=cos(x) from table
  345.           move   b,x0      y:(r5)+,y1       ;y1=sin(x) from table
  346.           move   x:(r2)+,a                  ;a=x(n)
  347.                                             ;x0=yr', y0=yi'
  348.           do     n5,Goer_in
  349.           mac    x0,x1,a     b,y0           ;a=x(n)+cosx*yr'
  350.           mac    -y0,y1,a                   ;a=x(n)+cosx*yr'-sinx*yi'
  351.           mpy    x0,y1,b     a,x0           ;b=sinx*yr'
  352.           mac    y0,x1,b     x:(r2)+,a      ;b=sinx*yr'+cosx*yi'
  353. Goer_in
  354.           mac    x0,x1,a     b,y0           ;a=x(n)+cosx*yr'
  355.           macr  -y0,y1,a                    ;a=x(n)+cosx*yr'-sinx*yi'
  356.           mpy    x0,y1,b                    ;b=sinx*yr'
  357.           macr   y0,x1,b     a1,x0          ;b=sinx*yr'+cosx*yi'
  358. ;-------------------------------------------------------------------------
  359. ;  Convert to magnitude, in place, putting magnitude
  360. ;-------------------------------------------------------------------------
  361. convert   mpy    x0,x0,a     b1,y0          ; A=yr**2,  put b into y0
  362.           mac    y0,y0,a     #<$40,x0       ; A=yr**2+yi**2
  363.           move   a1,y1                      ; transfer sum of squares to Y
  364.           move   a0,y0  
  365. ;------------------------------------------------------------------------
  366. ;  Take a square root to get the resolution back into to 24 bits.
  367. ;   Full Precision Square Root by Polynomial Approximation. 
  368. ;   y(y1:y0) = double precision (48 bit) positive input number
  369. ;   b = 24 bit output root, x0 = guess, x1 = bit being tested
  370. ;------------------------------------------------------------------------
  371. sqrt3     clr    b           x0,x1          ; init root and guess
  372.                                             ; init bit to test
  373.           do     #23,endsqrt
  374.           mpy    -x0,x0,a                   ; square and negate the guess
  375.           add    y,a                        ; compare to double precision input
  376.           tge    x0,b                       ; update root if input >= guess
  377.           tfr    x1,a                       ; get bit to test
  378.           asr     a                         ; shift to next bit to test
  379.           add    b,a  a,x1                  ; form new guess
  380.           move   a,x0                       ; save new guess
  381. endsqrt 
  382.           page
  383. ;---------------------------------------------------------------------
  384. ;   Log base 2 conversion routine.  Converts the positive magnitude     
  385. ;   data to (log base 2)/32.
  386. ;   See 56001 Manual for detail reference
  387. ;------------------------------------------------------------------------
  388. ; log of zero fixup...uses -1 for the log of zero
  389. ;------------------------------------------------------------------------
  390.           move      #>$000008,a
  391.           cmp       a,b      #-0.6228,a     ;for the log of zero use -120 dB
  392.           jle       <loga                   ;if argument is zero, force to max neg
  393.           move      m3,r7                   ;m3 = -1 ($FFFF)
  394.           rep       #23                     ;normalize to between .5 and 1.0
  395.           norm      r7,b                    ;shift left and decrement r7 if needed
  396.           move      #pcoef,r0               ;point to poly. coefs. for log2
  397.           move      b,x0                    ;put normalized number in x0
  398.           mpyr      x0,x0,a       y:(r0)+,y0   ;x**2, get a1
  399.           mpy       x0,y0,a  a,x1 y:(r0)+,y0   ;a1*x, mv x**2, get a2
  400.           mac       x1,y0,a       y:(r0)+,y0   ;a2* x**2, get a0
  401.           add       y0,a                    ;add in a0
  402.           asl       a                       ;multiply by 4
  403.           asl       a
  404.                     
  405.           asl       a                       ;shift out sign bit
  406.           move      r7,a2                   ;new sign = characteristic
  407.           rep       #6                      ;divide by 32, create sign bit
  408.           asr       a
  409. loga      rnd       a                       ;round result
  410.           move      a,y:(r4)+               ;update display table
  411. Goer_out                                    ;***** END OF DO LOOP!!! *****
  412.           rts                               ;return from Goertzel subroutine
  413.  
  414. ;------------------------------------------------------------------------
  415. ;  static data storage
  416. ;------------------------------------------------------------------------
  417.      IF     BOOTMODE==1                     ;*** if booting from ROM ***
  418. WIN_LOC   set    *-GO                       ;convince assembler to compute
  419. WIN_DAT                                     ;...get all tables together
  420.        nolist                               ;...at the end of the code in ROM
  421.        include   'window1'                  ;NOTE: the order IS important
  422.        include   'cosine'
  423.        include   'sine'
  424. pcoef  dc    .9981958,-.3372223,-.6626105   ;start of polynomial coefficent table
  425.           list
  426. Tab_Len   equ    *-WIN_DAT                  ;length of tables
  427.           
  428.      ELSE                                   ;*** if testing in RAM ***
  429.  
  430.      nolist
  431.     org    y:WIN_TABL
  432.     include    'window1'
  433.     org    y:COS_TABL
  434.     include    'cosine'
  435.     org    y:SIN_TABL
  436.     include    'sine'
  437. pcoef  dc    .9981958,-.3372223,-.6626105   ;start of polynomial coefficent table
  438.      list
  439.      ENDIF
  440.  
  441.           end    SPEC
  442.